package com.hisoft.processor;

import java.util.List;

import org.apache.log4j.Logger;

import com.hisoft.entity.Assert;
import com.hisoft.entity.Choose;
import com.hisoft.entity.Function;
import com.hisoft.entity.Html;
import com.hisoft.entity.Import;
import com.hisoft.entity.Loop;
import com.hisoft.entity.TestCase;
import com.hisoft.entity.Verify;
import com.hisoft.exception.AssertException;
import com.hisoft.selenium.SeleniumX;

/**
 * 处理testcase <b> </b>
 * 
 * @Author chenyue ( yue.chen2@hisoft.com ) Create on 2011-6-7
 */
public class TestCaseProcessor {

	Logger logger = Logger.getLogger(TestCaseProcessor.class);

	/**
	 * 
	 * <b>遍历执行testcase对象</b>
	 * 并且把执行记录在该对象里
	 * @Author chenyue ( yue.chen2@hisoft.com ) Create on 2011-6-9
	 */
	public List<TestCase> Processor(List<TestCase> testcaseList) {
		for (TestCase tc : testcaseList) {
			SeleniumX.startSelenium();// 启动selenium sever.
			logger.info("TestCase start.");
			long startTime = System.currentTimeMillis();// 用于记录case花费的时间，这是开始的时间
			try {
				for (Object o : tc.getOperateList()) {// 遍历执行case的每个操作
					if (o instanceof Html) {
						((Html) o).excute();
					} else if (o instanceof Verify) {
						((Verify) o).excute();
					} else if (o instanceof Assert) {
						try {
							((Assert) o).excute();
						} catch (AssertException e) {
							break;// 接到 AssertException 异常，当前case就中断。继续下一个case.
							// break打断整个循环，continue打断当前循环，继续下个循环
						}
					} else if (o instanceof Choose) {
						((Choose) o).excute();
					} else if (o instanceof Function) {
						((Function) o).excute();
					} else if (o instanceof Import) {
						((Import) o).excute();
					} else if (o instanceof Loop) {
						((Loop) o).excute();
					} else {
						// 未处理的标签实体
						logger.error("if you see this, please check com.adm.processor.TestCaseProcessor.Processor().");
					}
				}
			} catch (Exception e) {
				logger.error(e.getMessage(), e);// 记录case导致崩溃的异常，保护后面的case继续执行。
			}
			tc.setTime(System.currentTimeMillis() - startTime); // 用于记录case花费的时间，花费的时间
			logger.info("TestCase end.");
			SeleniumX.stopSelenium();// 关闭selenium sever.
		}
		return testcaseList;// 返回操作之后的 testcaseList，用于生成报告。
	}
}
